package com.leo.common;

import com.leo.db.DaoMapperProxy;
import com.leo.mapper.UserMapper;
import javafx.scene.control.*;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

/**
 * @BelongsProject: leo-emailfx
 * @BelongsPackage: com.leo.common
 * @Author: wangss
 * @CreateTime: 2023-03-13  23:18
 * @Description: TODO
 * @Version: 1.0
 */
@Slf4j
public class TextFieldTreeCellImpl extends TreeCell<String> {
    // 文本域外观组件对象
    private TextField textField;
    // 上下文菜单对象的创建
    private final ContextMenu addMenu = new ContextMenu();

    public TextFieldTreeCellImpl() {
        // 上下文菜单选项对象的创建
        MenuItem addMenuItem = new MenuItem("添加好友");
        // 将该选项添加至菜单
        addMenu.getItems().add(addMenuItem);
        // 设置菜单选项组件对象的鼠标点击事件处理回调函数
        addMenuItem.setOnAction(event -> {
            TreeItem newItem = new TreeItem("New Email");
            getTreeItem().getChildren().add(newItem);
            getTreeItem().setExpanded(true);
        });
    }

    // 实现继承自TreeCell类的同名模板方法
    @Override
    public void startEdit() {
        if (StringUtils.equalsAny(getText(), "收件箱", "草稿箱", "已发送邮件", "垃圾箱", "好友列表", ApplicationContentUtil.getContentMapValue("currentEmail").toString())) {
            return;
        }
        // 调用父类同名开始编辑模板方法
        super.startEdit();

        // 如果文本域对象为空则创建一个
        if (textField == null) {
            createTextField();
        }
        // 设置文本内容
        setText(null);
        // 设置编辑节点的图形元素为textField对象
        setGraphic(textField);
        // 文本域节点获取焦点选择
        textField.selectAll();
    }

    //取消编辑
    @Override
    public void cancelEdit() {
        // 调用模板类的取消编辑指令
        super.cancelEdit();

        // 获取当前选项为所选文字
        setText(getItem());
        // 设置当前选中节点为选中的外观图形元素
        setGraphic(getTreeItem().getGraphic());
    }

    @Override
    public void commitEdit(String newValue) {
        super.commitEdit(newValue);
        textField.setStyle("-fx-text-fill: black");
        if (StringUtils.isNotBlank(newValue) && !newValue.contains("@")) {
            log.error("邮箱格式错误");
            return;
        }

        if (ApplicationContentUtil.friendList.contains(newValue)) {
            log.error("邮箱已经存在");
            return;
        }

        int index = getIndex() - 6;
        int size = ApplicationContentUtil.friendList.size();
        UserMapper userMapper = DaoMapperProxy.getProxyInstance(UserMapper.class);
        if (StringUtils.isNotBlank(newValue)) {
            if (index >= size) {
                // 入库
                int num = userMapper.insertFriendInfo(newValue);
                // 加入列表
                if (1 == num) {
                    ApplicationContentUtil.friendList.add(newValue);
                }
            } else {
                // 更新
                String oldValue = ApplicationContentUtil.friendList.get(index);
                if (StringUtils.isNotBlank(oldValue)) {
                    int num = userMapper.updateFriendInfo(newValue, oldValue);
                    if (1 == num) {
                        ApplicationContentUtil.friendList.add(index, newValue);
                    }
                }
            }

        } else {
            if (index >= size) {
                getTreeItem().getParent().getChildren().remove(index);
                return;
            }
            String oldValue = ApplicationContentUtil.friendList.get(index);
            // 移除
            int delNum = userMapper.deleteFriendInfo(oldValue);
            if (1 == delNum) {
                ApplicationContentUtil.friendList.remove(index);
                getTreeItem().getParent().getChildren().remove(index);
            }
        }
    }

    @Override
    public void updateItem(String item, boolean empty) {
        // 修改选择节点
        super.updateItem(item, empty);
        // 当没有选择的时候
        if (empty) {
            // 若修改内容为空则选中节点内容设为null
            setText(null);
            // 设置选择的外观节点为null
            setGraphic(null);
        } else {
            // 判断是否是在编辑
            if (isEditing()) {
                // 判断选择编辑的文本内容是否为null
                if (textField != null) {
                    // 若不为空，则设置文本域的文本内容为所选择的内容
                    textField.setText(getString());
                }
                // 设置文本内容为空
                setText(null);
                // 设置外观组件为前文定义的textField对象
                setGraphic(textField);
            } else {
                // 设置TextFieldTreeCellImpl对象的文本内容为所选文本内容
                setText(getString());
                // 设置TextFieldTreeCellImpl对象的外观图形为所选树形结构节点的图形外观
                setGraphic(getTreeItem().getGraphic());
                // 判断不是叶子节点且有父亲节点
                if (!getTreeItem().isLeaf() && getTreeItem().getParent() != null && !ApplicationContentUtil.getContentMapValue("currentEmail").toString().equals(getString())) {
                    // 设置上下文菜单添加菜单对象
                    setContextMenu(addMenu);
                }
            }
        }
    }

    private void createTextField() {
        // 创建文本域对象取值为TextFieldTreeCellImpl类型treeCell对象选择的文本内容
        textField = new TextField(getString());
        // textField对象的键盘释放事件监听处理回调函数
        textField.setOnKeyReleased((KeyEvent t) -> {
            // 判断键盘事件对应的键位
            if (t.getCode() == KeyCode.ENTER) {
                // 如果是回车键则提交文本区域内容作为树形结构节点选项的提交编辑内容
                commitEdit(textField.getText());
            } else if (t.getCode() == KeyCode.ESCAPE) {
                // 当按的键盘键位是esc键就取消编辑功能
                cancelEdit();
            }
        });
    }

    // 利用继承的模板方法获取选项的选择文本内容
    private String getString() {
        return getItem() == null ? "" : getItem();
    }
}
